package menu;

import iterator.Iterator;

import java.util.Scanner;

import visitor.PrintingVisitor;

import container.Stack;
import enumeration.Enumeration;

import main.StackAsArray;

public class StackMenu implements Menu {
	private Stack stack;

	public void show(Stack stack) {
		this.stack = stack;
		try {
			while (executeFunction(callMenu()))
				;
		} catch (NoSuchOptionException e) {
			e.printStackTrace();
		}
	}

	public Integer callMenu() {
		System.out.println("\n*********************************************\n");
		System.out.println("Selecione uma opção");
		System.out.println("1: Push");
		System.out.println("2: Pop");
		System.out.println("3:Get Top");
		System.out.println("4: Is Empty?");
		System.out.println("5: Is Full?");
		System.out.println("6 Purge");
		System.out.println("7 Print Stack (Visitor)");
		System.out.println("8 Print Stack (Iterator)");
		System.out.println("9 Print Stack (Enumeration)");
		System.out.println("0: Exit");
		Scanner entrada = new Scanner(System.in);
		String option = entrada.nextLine();
		return new Integer(option);
	}

	public boolean executeFunction(Integer option) throws NoSuchOptionException {
		Scanner entrada = new Scanner(System.in);
		switch (option) {
		case 0:
			return false;
		case 1:
			System.out.println("Digite o valor a ser inserido na pilha:");
			String valor = entrada.next();
			stack.push(valor);
			break;
		case 2:
			System.out.println("Elemento " + stack.pop()
					+ " removido da pilha.");
			break;
		case 3:
			System.out.println("Topo da pilha: " + stack.getTop() + ".");
			break;
		case 4:
			if (stack.isEmpty())
				System.out.println("A pilha está vazia.");
			else
				System.out.println("A pilha não está vazia.");
			break;
		case 5:
			if (stack.isFull())
				System.out.println("A pilha está cheia.");
			else
				System.out.println("A pilha não está cheia.");
			break;
		case 6:
			System.out
					.println("A pilha foi reiniciada e todos seus elementos removidos.");
			stack.purge();
			break;
		case 7:
			System.out.println("Elementos da pilha: ");
			stack.accept(new PrintingVisitor());
			break;
		case 8:
			Iterator iterator = stack.getIterator();
			for (iterator.init(); iterator.test(); iterator.inc())
				System.out.println(iterator.current());
			break;
		case 9:
			Enumeration enumeration = stack.getEnumeration();
			while (enumeration.hasMoreElements()) {
				System.out.println(enumeration.nextElement());
			}
			break;
		default:
			throw new NoSuchOptionException("Opção invalida");
		}
		return true;
	}
}
